package com.cskaoyan.javase.array._6callby;

/**
 * @description: 方法的传值问题
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import java.util.Arrays;

/**
 * 什么是方法的传值问题?
 * 方法在调用时,是可能需要传入一个参数的,称之为"实参",
 * 那么如果在方法体内部修改了实参的取值,那么方法结束后,原先的实参本身会发生什么变化? 这就是方法的传值问题
 *
 * 两种传值的方式:
 * 1.值传递,指的是方法得到的是实参的拷贝,而不是实参本身(地址),那么:
 *      实参经过方法的修改后,方法执行完毕,并不会对原先的实参造成影响
 *
 * 2.引用传递,指的是方法得到的是实参本身(地址),而不是拷贝,那么:
 *      实参经过方法的修改后,方法执行完毕,会对原先的实参造成影响
 *
 * Java是值传递还是引用传递(又或者都有)?
 * 我们可以写方法测试一下:
 *      1.给出一个方法,修改基本数据类型int实参为它的二倍
 *          我们发现方法并不能修改基本数据类型实参的取值,从这一个案例来说,Java是值传递的
 *      2.给出一个方法,将数组元素变为它的二倍
 *          我们发现方法能够修改数组元素变为它的二倍 ---> 说明java对于引用数据类型是引用传递
 *      综上所述:
 *          Java是值传递和引用传递都有的,基本数据类型是值传递,引用数据类型是引用传递
 *
 * 以上的观点是完全错误的,是典型的低水平博客作者Ctrl+C/V得来的结论,是没有经过思考的结论
 *
 * 实际上,Java没有引用传递,Java有且仅有值传递
 *
 * 引用传递是不符合java的设计原则的,因为java的局部变量是不能在方法外部生效的
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        /*int num = 10;
        doubleIntValue(num);
        System.out.println(num);*/

        /*int[] arr = {1, 2, 3};
        System.out.println("调用方法之前:" + Arrays.toString(arr));
        doubleArrayElement(arr);
        System.out.println("调用方法之后:" + Arrays.toString(arr));*/


        /**
         * 思考:
         * 1.如果是值传递,能否交换成功?
         *      不能
         * 2.如果是引用传递,能否交换成功?
         *      能
         */
        int[] arr1 = {1, 2, 3};
        int[] arr2 = {3, 6, 9};
        System.out.println("交换之前arr1:" + Arrays.toString(arr1));
        System.out.println("交换之前arr2:" + Arrays.toString(arr2));
        swapArray(arr1, arr2);
        System.out.println("交换之后arr1:" + Arrays.toString(arr1));
        System.out.println("交换之后arr2:" + Arrays.toString(arr2));

    }

    //将方法传入的实参变为原先的二倍
    public static void doubleIntValue(int num) {
        num *= 2;
    }

    public static void doubleArrayElement(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            arr[i] *= 2;
        }
    }

    //交换两个数组的引用
    public static void swapArray(int[] arr1, int[] arr2) {
        //交换需要临时工temp
        int[] temp;
        temp = arr1;
        arr1 = arr2;
        arr2 = temp;
        System.out.println("交换方法中arr1:" + Arrays.toString(arr1));
        System.out.println("交换方法中arr2:" + Arrays.toString(arr2));
    }

}
